package com.liru.chat_demo.repository;

import com.liru.chat_demo.model.McpTool;
import org.springframework.stereotype.Repository;

import java.util.Collection;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

/**
 * MCP工具的内存仓库
 */
@Repository
public class McpToolRepository {
    // 使用线程安全的ConcurrentHashMap存储工具数据
    private final Map<String, McpTool> tools = new ConcurrentHashMap<>();

    /**
     * 保存或更新一个MCP工具
     * @param tool 需要保存或更新的工具
     * @return 保存后的工具
     */
    public McpTool save(McpTool tool) {
        // 将工具存入Map中，键为工具ID，值为工具对象
        tools.put(tool.getId(), tool);
        // 返回保存的工具
        return tool;
    }

    /**
     * 根据ID查找MCP工具
     * @param id 工具ID
     * @return 找到的工具，如果未找到则返回空
     */
    public Optional<McpTool> findById(String id) {
        // 从Map中获取指定ID的工具，如果不存在则返回null，包装为Optional返回
        return Optional.ofNullable(tools.get(id));
    }

    /**
     * 查找所有MCP工具
     * @return 所有工具的集合
     */
    public Collection<McpTool> findAll() {
        // 返回所有工具的值集合
        return tools.values();
    }

    /**
     * 查找所有已暴露的MCP工具
     * @return 所有已暴露的工具集合
     */
    public Collection<McpTool> findAllExposed() {
        // 从所有工具中筛选出已暴露的工具并返回
        return tools.values().stream()
                .filter(McpTool::isExposed)
                .collect(Collectors.toList());
    }

    /**
     * 根据服务器ID查找所有MCP工具
     * @param serverId 服务器ID
     * @return 指定服务器的所有工具集合
     */
    public Collection<McpTool> findAllByServerId(String serverId) {
        // 从所有工具中筛选出指定服务器的工具并返回
        return tools.values().stream()
                .filter(tool -> tool.getServerId().equals(serverId))
                .collect(Collectors.toList());
    }

    /**
     * 根据服务器ID删除所有MCP工具
     * @param serverId 服务器ID
     */
    public void deleteAllByServerId(String serverId) {
        // 移除指定服务器的所有工具条目
        tools.entrySet().removeIf(entry -> entry.getValue().getServerId().equals(serverId));
    }

    /**
     * 根据ID删除MCP工具
     * @param id 工具ID
     */
    public void deleteById(String id) {
        // 从Map中移除指定ID的工具
        tools.remove(id);
    }
}